/**
 * @Author       : Mo 2427995270@qq.com
 * @Date         : 2025-04-24 22:04:51
 * @LastEditTime : 2025-04-25 08:37:36
 * @FilePath     : \tca8424_stm32f407\hal_drivers\ll_exti.h
 * @Description  : 外部中断低层驱动
 * @Version      : V1.0
 * @History      :
 * @Note         :
 */

#ifndef __ll_exti_H__
#define __ll_exti_H__

/***************************************Includes***********************************/
#include "ll_gpio.h"
#include <stdint.h>


/*************************************Public Macros********************************/

/**
 * @brief 获取gpio ll实例
 * @note null
 */
#define exti_ll_get_gpio_ll(exti) ((exti)->gpio)
/**
 * @brief 获取用户参数
 * @note null
 */
#define exti_ll_get_usr_arg(exti) ((exti)->arg)
/**
 * @brief 获取电平状态 该状态仅在触发中断时更新，这意味着单边沿触发该状态保持不变
 * @note null
 */
#define exti_ll_get_state(exti) ((exti)->state)


/***********************************Public Statement*******************************/

typedef enum {
    EXTI_LL_MODE_INTERRUPT, // 中断
    EXTI_LL_MODE_EVENT,     // 事件
} exti_ll_mode_t;

typedef enum {
    EXTI_LL_TRIGGER_RISING,         // 上升沿
    EXTI_LL_TRIGGER_FALLING,        // 下降沿
    EXTI_LL_TRIGGER_RISING_FALLING, // 上升和下降沿触发
} exti_ll_trigger_t;

struct exti_ll;
typedef struct exti_ll exti_ll_t;
typedef void (*exti_ll_interrupt_cb_t)(exti_ll_t *elt);

typedef struct {
    uint32_t port;                   // gpio端口
    uint32_t pinnum;                 // gpio号
    gpio_ll_pull_t pull;             // 拉
    gpio_ll_speed_t speed;           // 速度
    exti_ll_mode_t mode;             // 模式
    exti_ll_trigger_t trigger;       // 触发类型
    uint32_t cfg_interrupt_priority; // 抢占中断优先级 建议优先级分组设置为4组，4位抢占
} exti_ll_config_t;

struct exti_ll {
    gpio_ll_t gpio;
    exti_ll_mode_t mode;             // 模式
    exti_ll_trigger_t trigger;          // 触发类型
    uint32_t cfg_interrupt_priority; // 抢占中断优先级 建议优先级分组设置为4组，4位抢占
    uint32_t state;                  // 电平状态 该状态仅在触发中断时更新，这意味着单边沿触发该状态保持不变
    void *arg;                       // 用户参数
    exti_ll_interrupt_cb_t cb;       // 中断回调
};


/***********************************Public Functions*******************************/

/**
 * @brief exti外部中断/事件控制器初始化
 * @param  elt              
 * @param  cfg              配置
 * @param  cb               中断回调
 * @param  arg              用户参数
 * @return int 0成功 -1失败
 * @note null
 */
int exti_ll_init(exti_ll_t *elt, exti_ll_config_t *cfg, exti_ll_interrupt_cb_t cb, void *arg);
/**
 * @brief 反初始化exti
 * @param  elt              
 * @return int 0成功 -1失败
 * @note null
 */
int exti_ll_deinit(exti_ll_t *elt);
/***************************************Public Variables**********************************/


#endif
/* [] END OF FILE */
